let fs = require('fs')

//把一个loader从一个绝对路径变成一个loader对象
function createLoaderObject(loader){
    let normal = require(loader)
    let pitch = normal.pitch;
    let raw = normal.raw;//决定loader的参数是字符串还是Buffer
    return {
        path:loader,//存放此loader的绝对路径
        normal,
        pitch,
        raw,
        data:{},//每个loader第一可以携带一个自定义data对象
        pitchExecuted:false,//此loader的pitch函数是够已经执行过
        normalExecuted:false,//此loader的normal函数是否已经执行过
    }
}

function runLoaders(options,finalCallback) {
    let { resource,loaders=[],context={},readResource=fs.readFile } = options;//src\index.js
    let loaderObjects = loaders.map(createLoaderObject)
    let loaderContext = context;
    loaderContext.resource = resource;//要加载的资源
    loaderContext.readResource = readResource;//读取资源的方法
    loaderContext.loaders = loaderObjects;//所有的loader对象
    loaderContext.loaderIndex = 0;//当前正在执行loader索引
    loaderContext.callback = null;
    loaderContext.async = null;//把loader的执行从同步变成异步 开始不赋值
    Object.defineProperty(loaderContext,'request',{
        get(){
            //拿到每个loader路径
            //loader1!loader2!loader!index.js
            return loaderContext.loader.map(l=>l.path).contact(loaderContext.resource).join('!')
        }
    })
}

exports.runLoaders = runLoaders